#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 设置鼠标追踪
    setMouseTracking(true);

    // 给 this 对象安装事件过滤器
    installEventFilter(this);
}

Widget::~Widget()
{
    delete ui;
}

bool Widget::event(QEvent *event)
{
    // 当前对象在执行 event 函数之前, 已经通过 eventFilter 函数将鼠标移动事件过滤掉了
    // 所以这里不会拦截到鼠标移动事件
    if (event->type() == QEvent::MouseMove) {
        QMouseEvent *mouse_event = static_cast<QMouseEvent *>(event);
        QString string = QString("QEvent 拦截: 鼠标在指定区域移动 X = %1 Y = %2").arg(mouse_event->x()).arg(mouse_event->y());

        qDebug() << string;

        return true;
    }

    // 其他事件交给父类处理
    return QWidget::event(event);
}

bool Widget::eventFilter(QObject *object, QEvent *event)
{
    // 过滤鼠标的移动事件
    if (object == this) {
        if (event->type() == QEvent::MouseMove) {
            QMouseEvent *mouse_event = static_cast<QMouseEvent *>(event);
            QString string = QString("事件高级过滤: 鼠标在指定区域移动 X = %1 Y = %2").arg(mouse_event->x()).arg(mouse_event->y());

            qDebug() << string;

            return true;
        }
    }


    // 其他事件交给父类处理
    return QWidget::eventFilter(object, event);
}


void Widget::mouseMoveEvent(QMouseEvent *event)
{
    // 尽管这里对鼠标的移动事件进行了处理, 但是 event 拦截事件的时候已经把鼠标移动事件拦截了
    // 所以后续的鼠标移动事件不会分发到这里
    QString string = QString("QMouseEvent 拦截: 鼠标在指定区域移动 X = %1 Y = %2").arg(event->x()).arg(event->y());

    qDebug() << string;
}
